package set

var empty = struct{}{}

// Set 定义集合的接口类型
type Set[T comparable] interface {
	// Add 添加元素到集合
	Add(values ...T)
	// Delete 从集合中删除元素
	Delete(values ...T)
	// HasAll 判断所有指定元素是否存在于集合
	HasAll(values ...T) bool
	// HasAny 判断任一指定元素是存在于集合
	HasAny(values ...T) bool
	// GetLength 获取集合长度
	GetLength() int
	// GetElements 获取集合的所有元素
	GetElements() []T
	// GetMap 获取集合的字典格式
	GetMap() map[T]struct{}

	// IsEmpty 判断集合是否为空
	IsEmpty() bool
	// IsEqualTo 判断两集合的元素是否完全相同
	IsEqualTo(other Set[T]) bool
	// IsSubsetOf 判断当前集合是否为指定集合的子集
	IsSubsetOf(other Set[T]) bool
	// IsSupersetOf 判断当前集合是否为指定集合的超集
	IsSupersetOf(other Set[T]) bool

	// Unite 求并集（不修改原集合，生成一个新的集合）
	Unite(other Set[T]) Set[T]
	// Intersect 求交集（不修改原集合，生成一个新的集合）
	Intersect(other Set[T]) Set[T]
	// Complement 求补集（不修改原集合，生成一个新的集合）
	Complement(other Set[T]) Set[T]

	// Range 遍历并获取每个元素
	Range(fn func(T))
	// Filter 过滤集合
	Filter(fn func(T) bool) []T
	// Clone 克隆当前集合
	Clone() Set[T]
	// Clear 清空集合
	Clear()
}

// ConvertToUnsafeSet 将指定集合转换为 UnsafeSet
func ConvertToUnsafeSet[T comparable](set Set[T]) Set[T] {
	return NewUnsafeSet(set.GetElements()...)
}

// ConvertToSafeSet 将指定集合转换为 SafeSet
func ConvertToSafeSet[T comparable](set Set[T]) Set[T] {
	return NewSafeSet[T](set.GetElements()...)
}

// ConvertToSyncSet 将指定集合转换为 SyncSet
func ConvertToSyncSet[T comparable](set Set[T]) Set[T] {
	return NewSyncSet[T](set.GetElements()...)
}
